在開始爬資料前,先來認識一下網路上常見的資料格式吧!
CSV
的全名是 Comma Separated Values,顧名思義就是用**逗點(,)**分隔的資料。雖然沒有完整的定義標準,但在資料格式不複雜時,算是個不錯的資料交換格式。Python 有提供標準的模組來操作 CSV 資料,這邊就介紹一些常用到的 API。
因為沒有需要安裝其他依賴,所以這邊可以不用進到虛擬環境中執行。也可以執行一下
pipenv shell
來養成使用虛擬環境的好習慣XD
先用 Mockaroo 這個網站來產生一些測試用的假資料,按「Preview」來預覽資料內容,或「Download Data」直接下載檔案。
下載後存到 mock_data.csv
檔案中,第一列(id, first_name, last_name, gender, country)是表頭(欄位名稱),其他列則是每筆資料的內容。
執行下列程式碼,可以讀取檔案印在畫面上。
import csv
with open('mock_data.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
print(', '.join(row))
執行下列程式碼,可以將資料寫入檔案。
import csv
with open('mock_data.csv', 'a', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow([3, 'Corri', 'Campling', 'Female', 'Sweden'])
list
轉換為 dict
前面都是把資料以 list
型態來處理資料,如果欄位的順序有變,程式都要一併修改。但既然都有表頭了,有沒有辦法用 dict
的型態來方便處理呢? 自問自答, 當然有!csv 模組另外提供了 csv.DictReader
和 csv.DictWriter
來滿足這個需求。
import csv
with open('mock_data.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
for row in reader:
print(row['first_name'], row['last_name'])
import csv
with open('mock_data.csv', 'a', newline='') as csvfile:
fieldnames = ['id', 'first_name', 'last_name', 'gender', 'country']
writer = csv.DictWriter(csvfile, fieldnames, delimiter=',', quotechar='"')
writer.writerow({
'id': 4,
'first_name': 'Salvatore',
'last_name': 'Gaitskill',
'gender': 'Male',
'country': 'Indonesia'
})